home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
DJGPP
/
DJSRC111.ZIP
/
go32
/
utils.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-11-12
|
4KB
|
161 lines
/* This is file UTILS.C */
/*
** Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
**
** This file is distributed under the terms listed in the document
** "copying.dj", available from DJ Delorie at the address above.
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
/* History:130,1 */
#include <dos.h>
#include "gotypes.h"
#include "tss.h"
#include "gdt.h"
#include "utils.h"
#include "dpmi.h"
#include "mswitch.h"
#include "exphdlr.h"
extern void _do_memset32();
extern void _do_memmov32();
extern void _do_memscan32();
extern int was_exception;
TSS *utils_tss = &o_tss;
void go_til_stop(void)
{
while (1)
{
if (use_DPMI)
{
if (!DPMIexecute())
return;
}
else
{
go32();
if (!was_exception)
return;
}
if (exception_handler())
return;
}
}
void zero32(word32 vaddr)
{
TSS *old_ptr;
old_ptr = tss_ptr;
tss_ptr = utils_tss;
utils_tss->tss_eip = (word16)_do_memset32;
utils_tss->tss_eax = 0;
utils_tss->tss_ecx = 4096;
utils_tss->tss_es = g_core*8;
utils_tss->tss_edi = vaddr;
go_til_stop();
tss_ptr = old_ptr;
}
void memput(word32 vaddr, void far *ptr, word16 len)
{
if (use_DPMI)
Pmemput(tss_ptr->tss_ds, vaddr, (void *)ptr, len);
else {
TSS *old_ptr;
/* if (tss_ptr == &ed_tss)
vaddr += 0x90000000L; */
old_ptr = tss_ptr;
tss_ptr = utils_tss;
utils_tss->tss_eip = (word16)_do_memmov32;
utils_tss->tss_ecx = len;
utils_tss->tss_es = g_core*8;
utils_tss->tss_edi = vaddr;
utils_tss->tss_ds = g_core*8;
utils_tss->tss_esi = (word32)FP_SEG(ptr)*16 + (word32)FP_OFF(ptr);
go_til_stop();
tss_ptr = old_ptr;
}
}
void memget(word32 vaddr, void far *ptr, word16 len)
{
if (use_DPMI)
Pmemget(tss_ptr->tss_ds, vaddr, (void *)ptr, len);
else {
TSS *old_ptr;
/* if (tss_ptr == &ed_tss)
vaddr += 0x90000000L; */
old_ptr = tss_ptr;
tss_ptr = utils_tss;
utils_tss->tss_eip = (word16)_do_memmov32;
utils_tss->tss_ecx = len;
utils_tss->tss_es = g_core*8;
utils_tss->tss_edi = (word32)FP_SEG(ptr)*16 + (word32)FP_OFF(ptr);
utils_tss->tss_ds = g_core*8;
utils_tss->tss_esi = vaddr;
go_til_stop();
tss_ptr = old_ptr;
}
}
void memscan32(word32 vaddr, void far *ptr, char term)
{
TSS *old_ptr;
old_ptr = tss_ptr;
tss_ptr = utils_tss;
utils_tss->tss_ebx = term;
utils_tss->tss_eip = (word16)_do_memscan32;
utils_tss->tss_es = g_core*8;
utils_tss->tss_edi = (word32)FP_SEG(ptr)*16 + (word32)FP_OFF(ptr);
utils_tss->tss_ds = g_core*8;
utils_tss->tss_esi = vaddr;
go_til_stop();
tss_ptr = old_ptr;
}
word32 peek32(word32 vaddr)
{
word32 rv;
memget(vaddr, &rv, 4);
return rv;
}
word16 peek16(word32 vaddr)
{
word16 rv=0;
memget(vaddr, &rv, 2);
return rv;
}
word8 peek8(word32 vaddr)
{
word8 rv=0;
memget(vaddr, &rv, 1);
return rv;
}
/*
void poke32(word32 vaddr, word32 v)
{
memput(vaddr, &v, 4);
}
void poke16(word32 vaddr, word16 v)
{
memput(vaddr, &v, 2);
}
void poke8(word32 vaddr, word8 v)
{
memput(vaddr, &v, 1);
} */